package com.cloudfun.campusshare.common.model.dto;

import com.cloudfun.campusshare.common.constant.PayType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author : zhangyongjie
 * @version : 1.0
 * @createTime : 2021/2/5 13:57
 * @description : 统一交易预创建请求体
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TradePreCreateDTO {

    /**
     * 商户在慧收钱门户创建生成的门店编号,非必填，不填时使用默认门店
     */
    private String subMerchantNo;

    /**
     * 商户系统内部订单号保证不重复，如：
     * 201900101130948003
     */
    private String transNo;

    /**
     * 服务端生成流水号
     */
    private String bizOrderNo;


    /**
     * 支付类型（必填）
     */
    private PayType payType;

    /**
     * 交易金额（单位：分  必填）
     */
    private String orderAmt;

    /**
     * 商品说明，例如：iphone商品，必填
     */
    private String goodsInfo;

    /**
     * 用户支付完成后，服务器主动通知商户服务器里指定地址，如：
     * https://www.merchant.com/xxx
     */
    private String returnUrl;

    /**
     * 交易日期格式[yyyyMMddHHmmss]，如：20190101140908 ( 必填)
     */
    private String requestDate;

    /**
     * 原样返回字段
     */
    private String extend;

    /**
     * 用户标识,风控参数，非必填
     */
    private String openId;


    /**
     * 营销账户信息 单位(分)
     * 格式
     * 商户1,金额1;商户2,金额2...
     * 例如
     * 100000363,10;100000364,90;
     */
    private String unionInfo;

    /**
     * 订单金额 单位：分
     * 例：1元则提交100
     * 订单金额=交易金额+营销金额
     * 营销账户信息不为空时订单金额为毕传，没有营销账户信息订单金额默认为交易金额
     */
    private String totalOrderAmt;

    /**
     * 扩展信息 扩展信息 json格式
     */
    private String memo;


    /**
     * 扩展信息
     */
    @Data
    public static class Memo{

        /**
         * 限制卡类型 1、微信产品上传此参数
         * (no_credit)--可限制用户不能使用信用卡支付，如：no_credit；
         * 2、支付宝产品上传(credit_group)-可限制所有信用卡，花呗支付方式，其它限制方式参考【支付宝渠道列表枚举】，
         * 指定多个渠道用逗号(,)分割，如：balance, moneyFund；
         */
        private String paylimit;

        /**
         * 交易开始时间
         * 格式[yyyyMMddHHmmss]，如：20190101140908
         */
        private String timeStart;

        /**
         * 交易结束时间
         * 格式[yyyyMMddHHmmss]，如：20190101140908
         */
        private String timeExpire;

        /**
         * 用户ID
         * 微信用户在商户对应appid下的唯一标识；
         * 1、当[支付类型]为微信-公众号支付、微信-小程序支付必输，获取方式可参考[获取openid]如：
         * oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
         */
        private String openid;

        /**
         * 微信appid
         * 微信或支付宝支付分配的公众账号ID、小程序ID以及应用编号；1、当[支付类型]为微信-公众号/支付宝-生活号、
         * 微信/支付宝-小程序、微信/支付宝-APP支付必输，如：wx8888888888888888
         */
        private String appid;

        /**
         * 终端用户IP
         * 、当[支付类型]为微信-H5支付时必输；交易预创建与支付时IP必须保持一致；必须传正确的用户端IP，支持ipv4、ipv6格式，如：123.12.12.123
         * 常见错误：网络环境未能通过安全验证，请稍后再试
         */
        private String spbillCreateIp = "172.22.11.2";

        /**
         * 分账信息
         * 规则：分账方编号,分账金额
         * 单位：分；
         * 如：2000000000000,1
         */
        private String shareInfo;

        /**
         * 经度（必填）
         *
         * 交易所在地经度 用于交易地点定位
         */
        private String longitude = "120";



        /**
         * 纬度（必填）
         *
         * 交易所在地纬度 用于交易地点定位
         */
        private String latitude = "30";

        /**
         * 区域信息
         *
         * 银联选填区域信息长度固定7
         */
        private String areaInfo;

        /**
         * 应用程序版本
         * 银联选填固定8位，长度不足右补空格
         */
        private String appVersion;

        /**
         * 设备类型
         * 银联选填终端设备类型，取值如下：
         * 01：自动柜员机（含 ATM 和 CDM）和多媒体自助终端
         * 02：传统 POS
         * 03：mPOS
         * 04：智能 POS
         * 05：II型固定电话
         */
        private String deviceType;


        /**
         * 终端设备号
         * 银联选填最多50位，终端设备的硬件序列号
         */
        private String deviceNo;

    }
}
